import pymysql
'''
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库，Python2 中则使用 mysqldb。
PyMySQL 遵循 Python 数据库 API v2.0 规范，并包含了 pure-Python MySQL 客户端库。
'''
# 打开数据库连接
'''
host：MySQL服务的地址，若数据库在本地上，使用 localhost 或者127.0.0.1。如果在其它的服务器上，则写对应的 IP地址
port：服务的端口号，默认为3306，不写则为默认值。
user：登录数据库的用户名
passwd：登录 MySQL 的密码
db：数据库名
charset：设置为 utf8 编码，解决存汉字乱码问题
'''
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test",
    charset="utf8")

# print(conn)
# print(type(conn))
# 获取连接下的游标
cursor_test = conn.cursor()

# 使用 execute()  方法执行 SQL 查询，查询数据库版本
# cursor_test.execute("SELECT VERSION()")
# 使用 fetchone() 方法返回一条数据.
# data = cursor_test.fetchone()
# print('Database version: %s' % data)

# 使用 execute() 方法执行 SQL，如果表存在则删除
# cursor_test.execute("DROP TABLE IF EXISTS test4")
# TODO 使用预处理语句创建表
# sql = """CREATE TABLE user_test (
#          FIRST_NAME  CHAR(20) NOT NULL,
#          LAST_NAME  CHAR(20),
#          AGE INT,
#          SEX CHAR(1),
#          INCOME FLOAT )"""
# cursor_test.execute(sql)

# todo  使用预处理语句插入数据
# sql = """INSERT INTO user_test(FIRST_NAME,
#          LAST_NAME, AGE, SEX, INCOME)
#          VALUES ('Fei', 'Fei', 20, 'M', 1000)"""
# try:
#    # 执行sql语句
#    cursor_test.execute(sql)
#    # 提交到数据库执行
#    conn.commit()
# except:
#    # 如果发生错误则回滚
#    conn.rollback()

# todo 查询数据
'''
fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
fetchall(): 接收全部的返回结果行.
rowcount: 这是一个只读属性，并返回执行 execute()方法后影响的行数
'''
# sql = """
#     select * from user_test"""
#
# try:
#     # 执行 sql 语句
#     cursor_test.execute(sql)
#     # 显示出所有数据
#     data_result = cursor_test.fetchall()
#     for row in data_result:
#         fname = row[0]
#         lname = row[1]
#         age = row[2]
#         sex = row[3]
#         income = row[4]
#         # 打印结果
#         print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
#               (fname, lname, age, sex, income))
# except:
#     print("Error: unable to fetch data")

# todo 更新操作
# sql = "UPDATE user_test SET AGE = AGE + 1 WHERE SEX = '%c'" % ('W')
#
# try:
#     # 执行SQL语句
#     a = cursor_test.execute(sql)
#     print("更新 %s 条数据" % a)
#     # 提交到数据库执行
#     conn.commit()
# except:
#     # 发生错误时回滚
#     conn.rollback()

# todo 删除操作
# sql = "DELETE FROM user_test where FIRST_NAME = '%s'" % 'Fei1'
#
# try:
#     # 执行SQL语句
#     a = cursor_test.execute(sql)
#     print('删除 %s 条数据' % a)
#     # 提交到数据库执行
#     conn.commit()
# except:
#     # 发生错误时回滚
#     conn.rollback()

'''
DB API中定义了一些数据库操作的错误及异常，下表列出了这些错误和异常:

异 常	描 述
Warning	当有严重警告时触发，例如插入数据是被截断等等。必须是 StandardError 的子类。
Error	警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError	当有数据库接口模块本身的错误（而不是数据库的错误）发生时触发。 必须是Error的子类。
DatabaseError	和数据库有关的错误发生时触发。 必须是Error的子类。
DataError	当有数据处理时的错误发生时触发，例如：除零错误，数据超范围等等。 必须是DatabaseError的子类。
OperationalError	指非用户控制的，而是操作数据库时发生的错误。例如：连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。必须是DatabaseError的子类。
IntegrityError	完整性相关的错误，例如外键检查失败等。必须是DatabaseError子类。
InternalError	数据库的内部错误，例如游标（cursor）失效了、事务同步失败等等。 必须是DatabaseError子类。
ProgrammingError	程序错误，例如数据表（table）没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。
NotSupportedError	不支持错误，指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数，然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。
'''

# 关闭数据库
conn.close()

